package com.itheima.reggie.config;

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import com.itheima.reggie.common.JacksonObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.List;

@Slf4j
@Configuration
@EnableSwagger2 //开启Swagger文档功能
@EnableKnife4j //使用前面导入的maven（增强Swagger的那个）
public class WebMvcConfig extends WebMvcConfigurationSupport {
    /**
     * 设置静态资源映射
     * 我们将前端的代码直接放进了resources中了，但是默认放的时static或者templates文件夹下的
     * 放在resources下就需要我们手动设置映射方式了
     * @param registry
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//        classpath其实就是resources目录
        log.info("开始静态资源映射");
        //下面第一个和第二个是生成接口（API）的，那两个路径是框架帮我们自动生成的，我们可以直接使用，
        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");

        registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
        registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
    }

    //js中如果是long类型的，他超过16位，就会发生精度缺失

    //其实默认的消息转换器作用是这样，比如将我们前面在EmployeeController写的方法很多不是有返回R对象嘛，它们就会把这个结果转成对应的JSON，响应给我们的页面
    //扩展mvc框架的消息转换器(不用的话会用springmvc默认的消息转换器)
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        //创建新的消息转换器对象
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        //设置对象转换器，底层使用JackSon将java转为Json()
        messageConverter.setObjectMapper(new JacksonObjectMapper());
        //加入到mvc框架的集合中（index设置为0，他就会先用我们这个新设的）
        converters.add(0,messageConverter);
    }

    @Bean
    public Docket createRestApi() {
        // 文档类型

        //其他都是固定的，就是apis这里写controller包，因为生成接口（API接口），他要去扫描包，每一个公共的方法都会被映射成一个接口（还要去上面添加静态资源映射）
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.itheima.reggie.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("瑞吉外卖")
                .version("1.0")
                .description("瑞吉外卖接口文档")
                .build();
    }

}
